package com.jie.lanxin.impl;

import com.jie.lanxin.vo.VivoAuth;
import org.springframework.boot.configurationprocessor.json.JSONException;
import org.springframework.boot.configurationprocessor.json.JSONObject;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

@Service  // 确保Spring能扫描到这个服务并进行管理
public class QueryImageService {

    private static final long POLLING_INTERVAL_MS = 5000; // 轮询间隔时间，单位为毫秒

    /**
     * 查询图片处理任务的进度。
     *
     * @param taskId 任务ID
     * @return 任务进度的JSON字符串
     * @throws UnsupportedEncodingException 如果编码不支持
     * @throws InterruptedException 如果线程被中断
     */
    public String queryImage(String taskId) throws UnsupportedEncodingException, InterruptedException {
        final String APP_ID = VivoAuth.appId; // 获取APP_ID
        final String APP_KEY = VivoAuth.appKey; // 获取APP_KEY
        final String METHOD = "GET"; // HTTP请求方法
        final String URI = "/api/v1/task_progress"; // API的URI
        final String DOMAIN = "api-ai.vivo.com.cn"; // API域名

        // 请求url参数
        Map<String, Object> data = new HashMap<>();
        data.put("task_id", taskId);
        String queryString = mapToQueryString(data); // 将参数转换为查询字符串
        HttpHeaders headers = VivoAuth.generateAuthHeaders(APP_ID, APP_KEY, METHOD, URI, queryString); // 生成授权头
        String url = String.format("http://%s%s?%s", DOMAIN, URI, queryString); // 拼接请求URL
        headers.add("Content-Type", "application/json"); // 设置请求头内容类型为JSON

        RestTemplate restTemplate = new RestTemplate();
        HttpEntity<String> requestEntity = new HttpEntity<>(headers); // 创建HTTP请求实体
        ResponseEntity<String> response; // 声明响应实体
        String responseBody; // 声明响应体字符串

        while (true) {
            response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class); // 发送GET请求
            responseBody = response.getBody(); // 获取响应体

            if (response.getStatusCode() == HttpStatus.OK) { // 判断响应状态是否为200 OK
                System.out.println("Response body: " + responseBody); // 输出响应体
                if (isTaskFinished(responseBody)) { // 判断任务是否完成
                    break;
                } else {
                    Thread.sleep(POLLING_INTERVAL_MS); // 任务未完成则等待一段时间后继续轮询
                }
            } else {
                System.out.println("Error response: " + response.getStatusCode()); // 输出错误状态码
                break;
            }
        }

        return responseBody; // 返回最终的响应体
    }

    /**
     * 将Map转换为查询字符串。
     *
     * @param map 包含查询参数的Map
     * @return 查询字符串
     */
    public static String mapToQueryString(Map<String, Object> map) {
        if (map.isEmpty()) {
            return "";
        }
        StringBuilder queryStringBuilder = new StringBuilder();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            if (queryStringBuilder.length() > 0) {
                queryStringBuilder.append("&");
            }
            queryStringBuilder.append(entry.getKey());
            queryStringBuilder.append("=");
            queryStringBuilder.append(entry.getValue());
        }
        return queryStringBuilder.toString(); // 返回查询字符串
    }

    /**
     * 判断任务是否完成。
     *
     * @param responseBody API响应体
     * @return 任务是否完成
     */
    private boolean isTaskFinished(String responseBody) {
        // 解析responseBody来判断任务是否完成
        // responseBody是JSON格式，且有一个"finished"字段表示任务是否完成
        try {
            JSONObject json = new JSONObject(responseBody);
            JSONObject result = json.getJSONObject("result");
            return result.getBoolean("finished"); // 解析JSON中的finished字段
        } catch (JSONException e) {
            e.printStackTrace();
            return false; // 如果解析出错则认为任务未完成
        }
    }
}
